

// 实现 babel 插件的时候有一些原则 1.尽可能复用老节点 2.尽可能少操作


// Babel 能够转译 ECMAScript 2015+ 的代码，使它在旧的浏览器或者环境中也能够运行
// Babel编译顺序为首先plugins从左往右,然后presets从右往左

// babel 插件
// @babel/parser 可以把源码转换成AST
// @babel/traverse用于对 AST 的遍历，维护了整棵树的状态，并且负责替换、移除和添加节点
// @babel/generate 可以把AST生成源码，同时生成sourcemap
// @babel/types 用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法，对编写处理 AST 逻辑非常有用
// @babel/template可以简化AST的创建逻辑
// @babel/code-frame可以打印代码位置
// @babel/core  Babel的编译器，核心 API 都在这里面，比如常见的 transform、parse,并实现了插件功能
// babylon  Babel的解析器，以前叫babel parser,是基于acorn扩展而来，扩展了很多语法,可以支持es2020、jsx、typescript等语法

// Visitor
// 访问者模式 Visitor 对于某个对象或者一组对象，不同的访问者，产生的结果不同，执行操作也不同
// Visitor 的对象定义了用于 AST 中获取具体节点的方法
// Visitor 上挂载以节点 type 命名的方法，当遍历 AST 的时候，如果匹配上 type，就会执行对应的方法

